package kgame5.pbe.atlantic.manager {
	import kgame5.k3d.core.math.Vector3D;
	import kgame5.k3d.core.obj3d.spacial.SpacialVO;
	import kgame5.pbe.engine.core.ITickedObject;

	import flash.utils.Dictionary;

	/*
	 * 坦克要移动的,在XOZ平面上移动，有自动绕行
	 * 网格碰撞，这个支持把地图分成大个的网格，每个网格里可以放任意多的任意大小的障碍物。
	 * 高级点的游戏要这么用
	 * 一个hardVO如果是4个方向，则检测与其他的东西的碰撞
	 * 注意这个是个很重要的可用的东西啊
	 * !注意这个不支持斜向。斜向不好做
	 * 保存障碍物，处理碰撞之类
	 * Init();
	 * AddBar();
	 * RemoveBar();
	 * ProcessMove4();
	 * 
	 */
	public class SpacialManagerFly implements ITickedObject {
		
		//可移动的
		private var dict : Dictionary ;

		//可碰撞的列表，都是spaicalVO.type=ANIMAL
		private var arr_collider : Vector.<SpacialVO>;//可碰撞的,执行碰撞
		
		//地图边界
		//private var bound : BoxBound2D = new BoxBound2D();

		//初始化，指定地图边界.barList是hardVO的list
		public function init(w:int,h:int) : void {

			dict= new Dictionary();

			arr_collider= new Vector.<SpacialVO>();
			
			//TODO 设置边界
		}

		
		public function addSpacialVO(vo : SpacialVO) : void {
			dict[vo.id] = vo;
			arr_collider.push(vo);		
		}

		public function removeSpacialVO(vo : SpacialVO) : void {
			delete dict[vo.id];
			var idx:int=arr_collider.indexOf(vo);
			if(idx==-1){
				arr_collider.splice(idx, 1);
			}
		}

		public function onTick(deltaTime : Number) : void {
			this.move();
			this.updateColliderList();
		}

		//让可以动的东西移动
		private function move() : void {
			for each(var vo:SpacialVO in dict) {
						//没移动最好了
				var a:Vector3D = vo.v3d_a;
				var v:Vector3D =vo.v3d_v;
				var p:Vector3D =vo.v3d_p;
				
				v.add(a);
				
				if(v.x==0&&v.z==0){
					return;
				}
				
				//1，先尝试加到指定位置
				p.add(v);
			}
		}

		//填充各个元素的碰撞列表
		private function updateColliderList() : void {
		//T.p("---------------检测全体碰撞-----------");
		
		//先清除各个碰撞
			for each(var c:SpacialVO in arr_collider) {
				c.collidedList = new Vector.<SpacialVO>();
			}
		
			var len : int = arr_collider.length;
		
			for(var i : int = 0;i < len - 1;i++) {
				var src : SpacialVO = arr_collider[i] as SpacialVO;
				for(var j : int = i + 1;j < len;j++) {
					var aim : SpacialVO = arr_collider[j] as SpacialVO;
				
					if(src.HitTestAABB(aim)) {
						src.collidedList.push(aim);
						aim.collidedList.push(src);
					}
				}
			}
		}
	}//end of class
}
